home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / script.lzh / script_0.4 / variables.c < prev    next >
C/C++ Source or Header  |  1996-12-19  |  3KB  |  144 lines

  1. /*
  2.    variables.c
  3.  
  4.    bf 11-28-96
  5. */
  6.  
  7. #include <string.h>
  8. #include <exec/memory.h>
  9. #include <proto/exec.h>
  10.  
  11. #include "script_library.h"
  12. #include "variables.h"
  13.  
  14. #define varAllocMem(pool,size) AllocPooled(pool,size)
  15. #define varFreeMem(pool,ptr,size) FreePooled(pool,ptr,size)
  16.  
  17. #if 0
  18. /// varAllocMem()
  19. static void *
  20. varAllocMem (void *pool, ULONG size)
  21. {
  22.   if (pool)
  23.     return AllocPooled (pool, size);
  24.   else
  25.     return AllocMem (size, MEMF_PUBLIC);
  26. }
  27. ///
  28.  
  29. /// varFreeMem()
  30. static void
  31. varFreeMem (void *pool, void *ptr, ULONG size)
  32. {
  33.   if (pool)
  34.     FreePooled (pool, ptr, size);
  35.   else
  36.     FreeMem (ptr, size);
  37. }
  38. ///
  39. #endif
  40.  
  41. /// FreeVariables()
  42. void
  43. FreeVariables (struct ScriptContext *sc)
  44. {
  45.   MinNode *node, *next;
  46.  
  47.   for (next = node = sc -> sc_Vars.mlh_Head; next = node -> mln_Succ; node = next)
  48.     FreeVariable (sc, (ScriptVar *) node);
  49. }
  50. ///
  51.  
  52. /// FreeVariable()
  53. void
  54. FreeVariable (struct ScriptContext *sc, ScriptVar *var)
  55. {
  56.   void *pool = NULL;
  57.  
  58.   Remove ((struct Node *) var);
  59.   pool = sc -> sc_MemPool;
  60.  
  61.   if (var -> sv_Name)
  62.     varFreeMem (pool, var -> sv_Name, strlen (var -> sv_Name) + 1);
  63.   if (var -> sv_Type == VT_STRING)
  64.   {
  65.     varFreeMem (pool, var -> uv.uv_Value, strlen (var -> uv.uv_Value) + 1);
  66.   }
  67.   varFreeMem (pool, var, sizeof (ScriptVar));
  68. }
  69. ///
  70.  
  71. /// SetStringVariable()
  72. ScriptVar *
  73. SetStringVariable (struct ScriptContext *sc, char *name, char *value)
  74. {
  75.   MinNode *node, *next;
  76.   void *pool = NULL;
  77.   ScriptVar *var;
  78.   ULONG len;
  79.  
  80.   pool = sc -> sc_MemPool;
  81.  
  82.   for (next = node = sc -> sc_Vars.mlh_Head; next = node -> mln_Succ; node = next)
  83.     if (strcmp (((ScriptVar *) node) -> sv_Name, name) == 0
  84.       && ((ScriptVar *) node) -> sv_Type == VT_STRING)
  85.     {
  86.       var = (ScriptVar *) node;
  87.  
  88.       varFreeMem (pool, var -> uv.uv_Value, strlen (var -> uv.uv_Value) + 1);
  89.  
  90.       len = strlen (value) + 1;
  91.       if (!(var -> uv.uv_Value = varAllocMem (pool, len)))
  92.       {
  93.         var -> sv_Type = VT_EMPTY;
  94.         FreeVariable (sc, var);
  95.         return NULL;
  96.       }
  97.       CopyMem (value, var -> uv.uv_Value, len);
  98.       return var;
  99.     }
  100.  
  101.   if (!(var = varAllocMem (pool, sizeof (ScriptVar))))
  102.     return NULL;
  103.  
  104.   len = strlen (name) + 1;
  105.   if (!(var -> sv_Name = varAllocMem (pool, len)))
  106.     goto cleanup;
  107.   CopyMem (name, var -> sv_Name, len);
  108.  
  109.   len = strlen (value) + 1;
  110.   if (!(var -> uv.uv_Value = varAllocMem (pool, len)))
  111.     goto cleanup;
  112.   CopyMem (value, var -> uv.uv_Value, len);
  113.  
  114.   var -> sv_Type = VT_STRING;
  115.   AddHead ((struct List *) &sc -> sc_Vars, (struct Node *) var);
  116.   return var;
  117.  
  118. cleanup:
  119.  
  120.   if (var)
  121.   {
  122.     if (var -> sv_Name)
  123.       varFreeMem (pool, var -> sv_Name, strlen (var -> sv_Name) + 1);
  124.     varFreeMem (pool, var, sizeof (ScriptVar));
  125.   }
  126.   return NULL;
  127. }
  128. ///
  129.  
  130. /// GetStringVariable()
  131. char *
  132. GetStringVariable (struct ScriptContext *sc, char *name)
  133. {
  134.   MinNode *node, *next;
  135.  
  136.   for (next = node = sc -> sc_Vars.mlh_Head; next = node -> mln_Succ; node = next)
  137.     if (strcmp (((ScriptVar *) node) -> sv_Name, name) == 0
  138.       && ((ScriptVar *) node) -> sv_Type == VT_STRING)
  139.       return ((ScriptVar *) node) -> uv.uv_Value;
  140.  
  141.   return NULL;
  142. }
  143. ///
  144.